CMake中链接库的顺序问题 您所在的位置:网站首页 动态库 链接 依赖 CMake中链接库的顺序问题

CMake中链接库的顺序问题

2024-07-15 12:16| 来源: 网络整理| 查看: 265

原文链接:https://blog.csdn.net/lifemap/article/details/7586363

cmake中链接库的顺序是a依赖b,那么b放在a的后面。

例如进程test依赖a库,b库, a库又依赖b 库,那么顺序如下: TARGET_LINK_LIBRARIES(test a b)

原文链接:https://www.cnblogs.com/aquester/p/10084070.html 前言

C/C++程序的许多同学被静态库的依赖折腾,因为默认情况下要求被依赖的库放在依赖它的库后面,当一个程序或共享库依赖的静态库较多时,可能会陷入解决链接问题的坑中。如果对静态库不熟悉,需要结构nm等工具来解决顺序问题。

但也可以偷懒,不关心静态库的顺序问题,ld为此提供了start-group和end-group两个选项,让包含在这两者间的静态库顺序可以随意。

方法

以CMake为例,假设程序x依赖三个静态库:libX1.a、libX2.a和libX3.a,而libX2.a又依赖libX1.a,libX3.a依赖libX2.a和libX1.a,正常情况下的CMakeLists.txt格式如下:

add_executable( x x.cpp ) target_link_libraries( x libX1.a libX2.a libX3.a )

上面的写法libX1.a、libX2.a和libX3.a的顺序不能变,只能按上面的先后顺序。如果去掉顺序的烦恼和痛苦,可以采用如下的写法:

target_link_libraries( x -Wl,--start-group libX1.a libX3.a libX2.a -Wl,--end-group )

target_link_libraries( x -Wl,--start-group libX3.a libX2.a libX1.a -Wl,--end-group )

都可以,完全不用关心顺序。

附3:gcc链接参数–whole-archive的作用 默认情况下,对于未使用到的符号(函数是一种符号),链接器不会将它们链接进共享库和可执行程序。

这个时候,可以启用链接参数“--whole-archive”来告诉链接器,将后面库中所有符号都链接进来,参数“-no-whole-archive”则是重置,以避免后面库的所有符号被链接进来。

附4:如何让有些“-l”链接静态库,而另一些链接共享库? 用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdynamic”指定链接共享库,使用示例:

-Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest

"-Wl"表示是传递给链接器ld的参数,而不是编译器gcc/g++的参数。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有